package com.hugang.aboutclassinitialization;

/**
 * 子类的初始化<clinit>
 * 1）、j = method() ---> System.out.println("子类静态方法");
 * 2）、子类的静态代码块 ---> System.out.println("子类静态代码块");
 *
 * 子类的实例化方法：
 * 1）、super() ---> System.out.println("子类非静态成员变量调用的非静态方法");
 *                   System.out.println("父类非静态代码块");
 *                   System.out.println("父类类构造方法");
 * 2）、非静态成员变量显示赋值：i = test() ---> System.out.println("子类非静态成员变量调用的非静态方法");
 * 3）、非静态代码块 ---> System.out.println("子类非静态代码块");
 * 4）、子类的构造器（最后） ---> System.out.println("子类构造方法");
 *
 * 此问题的执行顺序：
 * 先初始化父类(父类的clinit)：
 *      1）、j = method() --> System.out.println("父类静态方法");
 *      2）、静态代码块 ---> System.out.println("父类静态代码块");
 * 再初始化子类(子类的clinit)：
 *      1）、j = method() ---> System.out.println("子类静态方法");
 *      2）、子类的静态代码块 ---> System.out.println("子类静态代码块");
 * 实例化第一个子类son1：
 *  * 1）、实例化父类：super() ---> System.out.println("子类非静态成员变量调用的非静态方法");
 *  *                   System.out.println("父类非静态代码块");
 *  *                   System.out.println("父类类构造方法");
 *  * 2）、非静态成员变量显示赋值：i = test() ---> System.out.println("子类非静态成员变量调用的非静态方法");
 *  * 3）、非静态代码块 ---> System.out.println("子类非静态代码块");
 *  * 4）、子类的构造器（最后） ---> System.out.println("子类构造方法");
 * 实例化第二个子类son2：由于类只会加载一次，因此父类和子类的类初始化方法就不会再执行，只会执行子类的实例化方法：
 *  *  * 1）、实例化父类：super() ---> System.out.println("子类非静态成员变量调用的非静态方法");
 *  *  *                   System.out.println("父类非静态代码块");
 *  *  *                   System.out.println("父类类构造方法");
 *  *  * 2）、非静态成员变量显示赋值：i = test() ---> System.out.println("子类非静态成员变量调用的非静态方法");
 *  *  * 3）、非静态代码块 ---> System.out.println("子类非静态代码块");
 *  *  * 4）、子类的构造器（最后） ---> System.out.println("子类构造方法");
 *
 * @author hg
 * @date 2020/8/24 10:16
 */
public class Son extends Father{

    private static int j = method();

    static {
        System.out.println("子类静态代码块");
    }

    private int i = test();

    {
        System.out.println("子类非静态代码块");
    }

    Son() {
        System.out.println("子类构造方法");
    }

    public static int method() {
        System.out.println("子类静态成员变量调用的静态方法");
        return 1;
    }

    @Override
    public int test() {
        System.out.println("子类非静态成员变量调用的非静态方法");
        return 1;
    }

    public static void main(String[] args) {
        Son son1 = new Son();
        System.out.println();
        Son son2 = new Son();
    }
}
